package com.bbseguros.pesquisador.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.bbseguros.pesquisador.bean.MonitoramentoBean;
import com.bbseguros.pesquisador.util.ConnectDB;
import com.bbseguros.pesquisador.util.DateUtils;

/**
 * @author rrodrigues
 * 
 */
public class MonitoramentosDAO {

	private static Logger logger = Logger.getLogger(MonitoramentosDAO.class);

	private Connection conn = null;
	private static MonitoramentosDAO instance = null;

	private MonitoramentosDAO() {
		try {
			conn = ConnectDB.getConnection();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
	}

	public static MonitoramentosDAO getInstance() {
		if (instance == null) {
			instance = new MonitoramentosDAO();
		}
		return instance;
	}

	public List<MonitoramentoBean> selectByUserAndDate(MonitoramentoBean monitoramento) {

		List<MonitoramentoBean> monitoramentos = new ArrayList<MonitoramentoBean>();
		PreparedStatement stmt = null;
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}

			StringBuffer buffer = new StringBuffer();
			buffer.append("SELECT p.nome, m.data_inicio, m.data_fim, m.hora_inicio, m.hora_fim, m.local, m.id_monitoramento , m.id_pesquisa, m.protocolo");
			buffer.append(" FROM tbl_pesquisa p, tbl_monitoramento m");
			buffer.append(" WHERE ");
			buffer.append("p.id_pesquisas = m.id_pesquisa AND ");
			buffer.append("m.id_usuario = ? AND ");
			buffer.append("m.data_inicio >= ? AND ");
			buffer.append("m.data_fim <= ? ");
			buffer.append("ORDER BY m.data_inicio desc, m.hora_inicio desc;");

			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, monitoramento.getIdUsuario());
			stmt.setString(2, monitoramento.getDataInicio());
			stmt.setString(3, monitoramento.getDataFim());

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				monitoramento = new MonitoramentoBean();
				monitoramento.setId(rs.getString("id_monitoramento"));
				monitoramento.setIdPesquisa(rs.getString("id_pesquisa"));
				monitoramento.setLabelPesquisa(rs.getString("nome"));
				monitoramento.setDataInicio(DateUtils.unformatMySqlDate(rs.getString("data_inicio")));
				monitoramento.setDataFim(DateUtils.unformatMySqlDate(rs.getString("data_fim")));
				monitoramento.setHoraInicio(rs.getString("hora_inicio"));
				monitoramento.setHoraFim(rs.getString("hora_fim"));
				monitoramento.setLocal(rs.getString("local"));
				monitoramento.setProtocolo(rs.getString("protocolo"));
				monitoramentos.add(monitoramento);
			}

		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return monitoramentos;
	}

	/**
	 * @return
	 */
	public ArrayList<MonitoramentoBean> selectAllMonitoramentos() {
		
		PreparedStatement stmt = null;
		MonitoramentoBean monitoramento = null;
		ArrayList<MonitoramentoBean> list = new ArrayList<MonitoramentoBean>();
		
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}

			StringBuffer buffer = new StringBuffer();
			buffer.append("SELECT t.id_monitoramento, t.id_usuario, t.id_pesquisa, t.data_inicio, t.data_fim, t.local, t.resultado, t.status_envio, t.protocolo, u.codigo_usuario" +
					" FROM tbl_monitoramento t , tbl_usuario u WHERE t.id_usuario = u.id_usuario");
			
			stmt = conn.prepareStatement(buffer.toString());
			
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				monitoramento = new MonitoramentoBean();

				monitoramento.setId(rs.getString("id_monitoramento"));
				monitoramento.setIdUsuario(Integer.parseInt(rs.getString("id_usuario")));
				monitoramento.setIdPesquisa(rs.getString("id_pesquisa"));
				monitoramento.setDataInicio(rs.getString("data_inicio"));
				monitoramento.setDataFim(rs.getString("data_fim"));
				monitoramento.setLocal(rs.getString("local"));
				monitoramento.setResultadoPesquisa(rs.getString("resultado"));
				monitoramento.setProtocolo(rs.getString("protocolo"));
				monitoramento.setCodigoUsuario(rs.getString("codigo_usuario"));				
				monitoramento.setStatusEnvio(rs.getString("status_envio"));
				
				list.add(monitoramento);
			}

		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return list;
	}
	 
	/**
	 * @return
	 */
	public ArrayList<MonitoramentoBean> selectToConverter() {
		
		PreparedStatement stmt = null;
		MonitoramentoBean monitoramento = null;
		ArrayList<MonitoramentoBean> list = new ArrayList<MonitoramentoBean>();
		
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}

			StringBuffer buffer = new StringBuffer();
			buffer.append("SELECT t.id_monitoramento, t.id_usuario, t.id_pesquisa, t.data_inicio, t.data_fim, t.local, t.resultado, t.status_envio, t.protocolo, u.codigo_usuario" +
					" FROM tbl_monitoramento t , tbl_usuario u WHERE t.id_usuario = u.id_usuario AND (t.protocolo = '' OR t.protocolo = '0')");
			
			stmt = conn.prepareStatement(buffer.toString());
			
			ResultSet rs = stmt.executeQuery();
 
			while (rs.next()) {
				monitoramento = new MonitoramentoBean();

				monitoramento.setId(rs.getString("id_monitoramento"));
				monitoramento.setIdUsuario(Integer.parseInt(rs.getString("id_usuario")));
				monitoramento.setIdPesquisa(rs.getString("id_pesquisa"));
				monitoramento.setDataInicio(rs.getString("data_inicio"));
				monitoramento.setDataFim(rs.getString("data_fim"));
				monitoramento.setLocal(rs.getString("local"));
				monitoramento.setResultadoPesquisa(rs.getString("resultado"));
				monitoramento.setProtocolo(rs.getString("protocolo"));
				monitoramento.setCodigoUsuario(rs.getString("codigo_usuario"));				
				monitoramento.setStatusEnvio(rs.getString("status_envio"));
				
				list.add(monitoramento);
			}

		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return list;
	}
	
	/**
	 * @param monitoramento
	 * @return
	 */
	public MonitoramentoBean selectById(MonitoramentoBean monitoramento) {

		PreparedStatement stmt = null;
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}

			StringBuffer buffer = new StringBuffer();
			buffer.append("SELECT * FROM tbl_monitoramento ");
			buffer.append(" WHERE ");
			buffer.append("id_monitoramento = ? ");

			stmt = conn.prepareStatement(buffer.toString());
			stmt.setString(1, monitoramento.getId());

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				monitoramento = new MonitoramentoBean();

				monitoramento.setId(rs.getString("id_monitoramento"));
				monitoramento.setIdUsuario(Integer.parseInt(rs.getString("id_usuario")));
				monitoramento.setIdPesquisa(rs.getString("id_pesquisa"));
				monitoramento.setDataInicio(rs.getString("data_inicio"));
				monitoramento.setDataFim(rs.getString("data_fim"));
				monitoramento.setLocal(rs.getString("local"));
				monitoramento.setResultadoPesquisa(rs.getString("resultado"));
				monitoramento.setMsgReturn(rs.getString("msg_ret_wsbb"));
			}

		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return monitoramento;
	}

	
	public boolean updateMonitoramento(MonitoramentoBean bean) {
		boolean toReturn = false;
		PreparedStatement stmt = null;
		
		try {
			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			
			StringBuffer buffer = new StringBuffer();
			buffer.append("UPDATE tbl_monitoramento SET resultado = ? , protocolo = ?, msg_ret_wsbb = ? ,status_envio = ? WHERE id_monitoramento = ?");

			logger.debug("PARAMETROS: "+bean.getResultadoPesquisa()+" - "+bean.getId());
			
			stmt = conn.prepareStatement(buffer.toString());
			stmt.setString(1, bean.getResultadoPesquisa());
			stmt.setString(2, bean.getProtocolo());
			stmt.setString(3, bean.getMsgReturn());
			stmt.setString(4, bean.getStatusEnvio());
			stmt.setString(5, bean.getId());
						
			int ret = stmt.executeUpdate();
			logger.debug("RET: "+ret);
			
			if (ret > 0) {
				toReturn = true;
			}
			logger.debug("toReturn: " + toReturn);
			
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return toReturn;
	}
	
	/**
	 * @param bean
	 * @return
	 */
	public boolean insertMonitoramento(MonitoramentoBean bean) {
		boolean toReturn = false;
		PreparedStatement stmt = null;
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}
			int idMonit = getMonitoramentosId();

			StringBuffer buffer = new StringBuffer();
			buffer.append("INSERT INTO tbl_monitoramento ");
			buffer.append("(id_monitoramento, id_usuario, id_pesquisa, data_inicio, hora_inicio, data_fim, hora_fim, local, resultado, protocolo, data_recebimento, msg_ret_wsbb, status_envio) ");
			buffer.append("VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

			stmt = conn.prepareStatement(buffer.toString());
			stmt.setInt(1, idMonit);
			stmt.setInt(2, bean.getIdUsuario());
			stmt.setString(3, bean.getIdPesquisa());
			stmt.setString(4, bean.getDataInicio());
			stmt.setString(5, bean.getHoraInicio());
			stmt.setString(6, bean.getDataFim());
			stmt.setString(7, bean.getHoraFim());
			stmt.setString(8, bean.getLocal());
			stmt.setString(9, bean.getResultadoPesquisa());
			stmt.setString(10, bean.getRecibo());
			stmt.setString(11, bean.getDataRecebimento());
			stmt.setString(12, bean.getMsgReturn());
			stmt.setInt(13, 1);

			int ret = stmt.executeUpdate();
			if (ret > 0) {
				toReturn = true;
			}
			logger.debug("Insert com sucesso: " + toReturn);
		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return toReturn;
	}

	/**
	 * @return
	 */
	public int getMonitoramentosId() {
		if (conn == null) {
			return 0;
		}
		Statement stmt = null;
		int returnId = 0;

		try {
			returnId = ConnectDB.getSequenceMySql(conn, "seq_monitoramento");

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);
		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return returnId;
	}

	/**
	 * @return
	 */
	public String getActualDateTime() {
		PreparedStatement stmt = null;
		String dateTime = null;
		try {

			if (conn == null) {
				conn = ConnectDB.getConnection();
			}

			StringBuffer buffer = new StringBuffer();
			buffer.append("SELECT NOW();");

			stmt = conn.prepareStatement(buffer.toString());

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				dateTime = rs.getString(1);
			}

		} catch (SQLException e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} catch (Exception e) {
			conn = null;
			logger.error(e.getMessage(), e);

		} finally {
			ConnectDB.cleanUp(stmt);
		}
		return dateTime;
	}
}
